home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / basic / qbnws104.zip / FOSSIL.ZIP / FOSSIL2.BAS < prev   
Encoding:
BASIC Source File  |  1990-07-29  |  19.6 KB  |  739 lines

  1. DECLARE SUB Parser (Parse$, Params%, Arg$())
  2. DECLARE SUB Terminal (ComPort%, AnsiHand%, Baud$, HandShake%, Echo%, LineFeeds%, Reg AS ANY)
  3. DECLARE SUB AnsiPrint (AnsiHand%, Send$)
  4. DECLARE SUB FossilDeInit (ComPort%, Reg AS ANY)
  5. DECLARE SUB FossilInit (ComPort%, Reg AS ANY)
  6. DECLARE SUB Recieve (ComPort%, Send%, Reg AS ANY)
  7. DECLARE SUB SetDtr (ComPort%, DtrStatus$, Reg AS ANY)
  8. DECLARE SUB SetHandShake (ComPort%, HandShake%, Reg AS ANY)
  9. DECLARE SUB SetPortParams (ComPort%, Baud$, Bits%, Stops%, Parity$, Reg AS ANY)
  10. DECLARE SUB Status (ComPort%, Info%, Reg AS ANY)
  11. DECLARE SUB Transmit (ComPort%, Send%, Reg AS ANY)
  12. DECLARE SUB BaudSelect (ComPort%, AnsiHand%, Baud$, Bits%, Stops%, Parity$, Reg AS ANY)
  13.  
  14.  
  15. ' *****************
  16. ' ** Fossil.Bas  **
  17. ' *****************
  18. '
  19. ' $INCLUDE: 'QB.BI'                      ' Include Data Types for INTERRUPT calls
  20.  
  21. Version$ = "Fossil Version 2.00a"        ' Program version stamp
  22. VersionDate$ = "July 29th, 1990"
  23.                                  
  24. DIM SHARED Reg AS RegType                ' Used for INTERRUPT calls
  25. DIM Arg$(20)                             ' Used for command line parser
  26.  
  27. CrLf$ = CHR$(&HD) + CHR$(&HA)            ' A Carriage return + linefeed string
  28.  
  29. Baud$ = "9600"
  30. HandShake% = 2
  31. ComPort% = 0
  32. Echo% = 0
  33.  
  34. LOCATE , , 1                     ' Turn curser on
  35.  
  36. CALL AnsiPrint(AnsiHand%, CHR$(27) + "[2J")   ' Clear the screen
  37. CALL AnsiPrint(AnsiHand%, CrLf$ + Version$ + CrLf$)
  38. CALL AnsiPrint(AnsiHand%, "By Chris Wagner " + VersionDate$ + CrLf$ + CrLf$)
  39.  
  40. Parse$ = UCASE$(COMMAND$)         ' Get command line paramaters
  41. CALL Parser(Parse$, Params%, Arg$())
  42. FOR Counter1% = 1 TO Params%
  43.     SELECT CASE LEFT$(Arg$(Counter1%), 3)
  44.  
  45.     CASE "-BD"  ' Set baud rate
  46.         Baud$ = RIGHT$(Arg$(Counter1%), LEN(Arg$(Counter1%)) - 3)
  47.         CALL AnsiPrint(AnsiHand%, "Setting Baud rate set to " + Baud$ + CrLf$)
  48.  
  49.     CASE "-CP" ' Set COM port
  50.         ComPort% = VAL(RIGHT$(Arg$(Counter1%), LEN(Arg$(Counter1%)) - 3)) - 1
  51.         SELECT CASE ComPort%
  52.         CASE 0 TO 3
  53.             CALL AnsiPrint(AnsiHand%, "Using Comminications port COM" + LTRIM$(STR$(ComPort% + 1)) + CrLf$)
  54.         CASE ELSE
  55.             ComPort% = 0
  56.             CALL AnsiPrint(AnsiHand%, "Invalid Communications port parameter:  " + Arg$(Counter1%) + CrLf$)
  57.             CALL AnsiPrint(AnsiHand%, "Using Comminications port COM1" + CrLf$)
  58.         END SELECT
  59.  
  60.     CASE "-HS" ' Set handshake type
  61.         HandShake$ = UCASE$(RIGHT$(Arg$(Counter1%), LEN(Arg$(Counter1%)) - 3))
  62.         HandShake% = VAL("&H" + HandShake$)
  63.         IF HandShake% > &HF THEN
  64.             CALL AnsiPrint(AnsiHand%, "Bad HandShake Enable parameter:  " + LTRIM$(STR$(HandShake%)) + CrLf$)
  65.         END IF
  66.  
  67.     CASE "-LR" ' Add linefeeds to received carriage returns
  68.         LineFeeds% = LineFeeds% OR 1
  69.  
  70.     CASE "-LT" ' Add linefeeds to transmitted carriage returns
  71.         LineFeeds% = LineFeeds% OR 2
  72.  
  73.     CASE "-EC" ' Set local echo on or off
  74.         Echo$ = UCASE$(RIGHT$(Arg$(Counter1%), LEN(Arg$(Counter1%)) - 3))
  75.         Echo% = VAL(LEFT$(Echo$, 1))
  76.  
  77.     CASE ELSE
  78.         CALL AnsiPrint(AnsiHand%, "Invalid Parameter: " + CHR$(34) + Arg$(Counter1%) + CHR$(34) + CrLf$)
  79.     END SELECT
  80. NEXT Counter1%
  81.  
  82. CALL Terminal(ComPort%, AnsiHand%, Baud$, HandShake%, Echo%, LineFeeds%, Reg)      ' The terminal itself
  83.  
  84. CALL AnsiPrint(AnsiHand%, CHR$(27) + "[2J")          ' Clear the screen
  85.  
  86. AnsiHand% = -1
  87. CALL AnsiPrint(AnsiHand%, "")
  88.  
  89. CALL FossilDeInit(ComPort%, Reg)
  90.  
  91. END
  92.  
  93. SUB AnsiPrint (AnsiHand%, Send$)
  94.  
  95. SELECT CASE AnsiHand%
  96.     CASE 0
  97.     AnsiHand% = FREEFILE
  98.     OPEN "CONS:" FOR OUTPUT AS #AnsiHand%
  99.     CASE -1
  100.     CLOSE #AnsiHand%
  101.     AnsiHand% = 0
  102.     EXIT SUB
  103.     CASE ELSE
  104. END SELECT
  105.  
  106. PRINT #AnsiHand%, Send$;
  107.  
  108. END SUB
  109.  
  110. SUB BaudSelect (ComPort%, AnsiHand%, Baud$, Bits%, Stops%, Parity$, Reg AS RegType)
  111.  
  112. CrLf$ = CHR$(&HD) + CHR$(&HA)
  113.  
  114. CALL AnsiPrint(AnsiHand%, CrLf$)
  115. CALL AnsiPrint(AnsiHand%, "Current baud rate:  " + Baud$ + CrLf$)
  116. CALL AnsiPrint(AnsiHand%, CrLf$)
  117. CALL AnsiPrint(AnsiHand%, "Select a baud rate:" + CrLf$)
  118. CALL AnsiPrint(AnsiHand%, "   A.    300" + CrLf$)
  119. CALL AnsiPrint(AnsiHand%, "   B.    600" + CrLf$)
  120. CALL AnsiPrint(AnsiHand%, "   C.   1200" + CrLf$)
  121. CALL AnsiPrint(AnsiHand%, "   D.   2400" + CrLf$)
  122. CALL AnsiPrint(AnsiHand%, "   E.   4800" + CrLf$)
  123. CALL AnsiPrint(AnsiHand%, "   F.   9600" + CrLf$)
  124. CALL AnsiPrint(AnsiHand%, "   G.  19200" + CrLf$)
  125. CALL AnsiPrint(AnsiHand%, "   H.  38400" + CrLf$)
  126. CALL AnsiPrint(AnsiHand%, "   Q.  No Change" + CrLf$)
  127. CALL AnsiPrint(AnsiHand%, CrLf$)
  128.  
  129. WHILE INKEY$ <> "": WEND  ' Clear the keyboard buffer
  130.  
  131. DO
  132.     SELECT CASE UCASE$(INKEY$)
  133.     CASE ""
  134.     CASE "A"
  135.         Baud$ = "300"
  136.         EXIT DO
  137.     CASE "B"
  138.         Baud$ = "600"
  139.         EXIT DO
  140.     CASE "C"
  141.         Baud$ = "1200"
  142.         EXIT DO
  143.     CASE "D"
  144.         Baud$ = "2400"
  145.         EXIT DO
  146.     CASE "E"
  147.         Baud$ = "4800"
  148.         EXIT DO
  149.     CASE "F"
  150.         Baud$ = "9600"
  151.         EXIT DO
  152.     CASE "G"
  153.         Baud$ = "19200"
  154.         EXIT DO
  155.     CASE "H"
  156.         Baud$ = "38400"
  157.         EXIT DO
  158.     CASE "Q"
  159.         CALL AnsiPrint(AnsiHand%, "Baud not changed" + CrLf$)
  160.         CALL AnsiPrint(AnsiHand%, CrLf$)
  161.         EXIT SUB
  162.     CASE ELSE
  163.     END SELECT
  164. LOOP
  165.  
  166. CALL SetPortParams(ComPort%, Baud$, Bits%, Stops%, Parity$, Reg)
  167. CALL AnsiPrint(AnsiHand%, "Baud changed to:  " + Baud$ + CrLf$)
  168.  
  169. END SUB
  170.  
  171. SUB FossilDeInit (ComPort%, Reg AS RegType)
  172.  
  173. ' Release the FOSSIL device driver (Call when finished)
  174. '
  175. ' ah = &H05    Fossil Function Number - DeInitialize FOSSIL driver
  176. ' al = &H00    Place Holder
  177. ' dx = Communications port number (0-3)
  178.  
  179. Reg.ax = &H500
  180. Reg.dx = ComPort%
  181. CALL Interrupt(&H14, Reg, Reg)
  182.  
  183. END SUB
  184.  
  185. SUB FossilInit (ComPort%, Reg AS RegType)
  186.  
  187. ' Initialize the FOSSIL device driver
  188. '
  189. ' dx = Communications port number (0-3)
  190. ' ah = &H04    Fossil Function Number - Initialize FOSSIL driver
  191. '                                       (Raises DTR in the porcess)
  192.  
  193. Reg.dx = ComPort%
  194. Reg.ax = &H400
  195. CALL Interrupt(&H14, Reg, Reg)
  196.  
  197. IF Reg.ax <> &H1954 THEN
  198.     CLS
  199.     PRINT
  200.     PRINT "ERROR:  Fossil Driver not responding - READ MANUAL!"
  201.     PRINT "You may need to add DEVICE={path}\X00.SYS for proper operation"
  202.     PRINT "    (Note:  {path} means the drive:\path where the file is located"
  203.     PRINT
  204.     SLEEP (5)
  205.     END
  206. END IF
  207.  
  208. END SUB
  209.  
  210. '    DECLARE SUB Parser (Parse$, Params%, Arg$())
  211. '
  212. '    DIM Arg$(50)
  213. '    CLS
  214. '
  215. '    Parse$ = "    1a 2bb 3ccc   4dddd   5eeeee 6ffffff     "
  216. '
  217. '    CALL Parser(Parse$, Params%, Arg$())
  218. '
  219. '    FOR Counter1% = 1 TO Params%
  220. '          PRINT Counter1%, CHR$(34) + Arg$(Counter1%) + CHR$(34)
  221. '    NEXT Counter1%
  222. '
  223. '   Argument splitter by Chris Wagner
  224. '   call with:
  225. '
  226. '        Parse$ = input to be divided
  227. '
  228. '   Returns:
  229. '        Params%   Number of parameters
  230. '        Arg$()    Array of arguments, starting at 1
  231. '
  232. '
  233. SUB Parser (Parse$, Params%, Arg$())
  234.  
  235. Params% = 0
  236. Temp$ = RTRIM$(Parse$)
  237.  
  238. DO
  239.     Temp$ = LTRIM$(Temp$)
  240.     IF LEN(Temp$) = 0 THEN EXIT DO
  241.     Temp% = INSTR(Temp$, SPACE$(1))
  242.  
  243.     IF Temp% = 0 THEN
  244.     Params% = Params% + 1
  245.     Arg$(Params%) = Temp$
  246.     EXIT DO
  247.     END IF
  248.  
  249.     Arg$(Params% + 1) = RTRIM$(LEFT$(Temp$, Temp%))
  250.     Temp$ = RIGHT$(Temp$, LEN(Temp$) - Temp%)
  251.     IF LEN(Arg$(Params% + 1)) > 0 THEN Params% = Params% + 1
  252. LOOP
  253.  
  254. END SUB
  255.  
  256. SUB Recieve (ComPort%, Send%, Reg AS RegType)
  257.  
  258. CALL Status(ComPort%, Info%, Reg) ' Test for space in OUTPUT buffer
  259.  
  260. IF (Info% AND &H4) = 0 THEN
  261.     IF (Info% AND &H2) = &H2 THEN
  262.     ' ah = &H02      Fossil Function Number - Recieve Character
  263.     ' al = &H00      Place Holder
  264.     ' dx = Communications port (0-3)
  265.     Reg.ax = &H200
  266.     Reg.dx = ComPort%
  267.     CALL Interrupt(&H14, Reg, Reg)
  268.     Send% = Reg.ax
  269.       ELSE
  270.     Send% = -1 ' No Characters in input buffer
  271.     END IF
  272.   ELSE ' Input buffer over-run
  273.     Send% = -2
  274.     ' ah = &H0A      Fossil Function Number - Purge INPUT Buffer
  275.     ' al = &H00      Place Holder
  276.     ' dx = Communications port (0-3)
  277.     Reg.ax = &HA00
  278.     Reg.dx = ComPort%
  279.     CALL Interrupt(&H14, Reg, Reg)
  280.     CLS
  281.     PRINT
  282.     PRINT " *** Input buffer over-run."
  283.     PRINT "     Buffer purged."
  284.     PRINT
  285.     SLEEP (5)
  286. END IF
  287.  
  288. END SUB
  289.  
  290. SUB SetDtr (ComPort%, DtrStatus$, Reg AS RegType)
  291.  
  292. ' ah = &H06    Fossil Function Number - DTR Control
  293. ' al = &H00    Fossil Sub-Function    - Lower DTR
  294. ' al = &H01    Fossil Sub-Function    - Raise DTR
  295. ' dx = Communications port number     - (0-3)
  296.  
  297. Reg.dx = ComPort%
  298.  
  299. SELECT CASE UCASE$(DtrStatus$)
  300.     CASE "LOW"
  301.     Reg.ax = &H600
  302.     CASE "HIGH"
  303.     Reg.ax = &H601
  304.     CASE ELSE
  305.     Reg.ax = &H600
  306.     CLS
  307.     PRINT
  308.     PRINT "Invalid parameter for DTR in SetDtr:  "; CHR$(34); DtrStatus$; CHR$(34)
  309.     PRINT "Setting DTR LOW."
  310.     PRINT
  311.     SLEEP (5)
  312. END SELECT
  313.  
  314. CALL Interrupt(&H14, Reg, Reg)
  315.  
  316. END SUB
  317.  
  318. SUB SetHandShake (ComPort%, HandShake%, Reg AS RegType)
  319.  
  320. ' ah = &H0F    Fossil Function Number - Flow Control
  321. ' al = &Hxx    Flow Control bit mask
  322. ' dx = Communications port number (0-3)
  323. '
  324. '  HandShake% = BITMAP                                        3 2 1 0
  325. '
  326. ' Enable FOSSIL to restrain remote using XON/XOFF             1 - - -  (Reg.ax OR &H8)
  327. ' Enable FOSSIL to use RTS/CTS                                - - 1 -  (Reg.ax OR &H2)
  328. ' Enable remote to restrain FOSSIL transmitter using XON/XOFF - - - 1  (Reg.ax OR &H1)
  329.  
  330. Reg.dx = ComPort%
  331.  
  332. IF HandShake% > &HF THEN
  333.     HandShake% = &H2
  334.     CLS
  335.     PRINT
  336.     PRINT "Invalid parameter for HandShake in SetHandShake:  "; LTRIM$(STR$(HandShake%)); CHR$(34)
  337.     PRINT "Setting HandShake to RTS/CTS."
  338.     PRINT
  339.     SLEEP (5)
  340. END IF
  341.  
  342. Reg.ax = &HF00 + HandShake%
  343. CALL Interrupt(&H14, Reg, Reg)
  344.  
  345. ' ah = &H10    Fossil Function Number - Ctl+C, Ctl+K Checking
  346. ' al = &Hxx    Check Enable bit mask
  347. ' dx = Communications port number (0-3)
  348.  
  349. Reg.ax = &H1000
  350. Reg.dx = ComPort%
  351. CALL Interrupt(&H14, Reg, Reg)
  352.  
  353. END SUB
  354.  
  355. SUB SetPortParams (ComPort%, Baud$, Bits%, Stops%, Parity$, Reg AS RegType)
  356.  
  357. ' ah = &H00    Fossil Function Number - Set Communications Parameters
  358. ' al = &Hxx    Baud/Parity/Stops
  359. ' dx = Communications port number (0-3)
  360.  
  361. Reg.dx = ComPort%
  362. Reg.ax = 0
  363.  
  364. ' Bit Mapped instruction     7 6 5 4 3 2 1 0
  365. '
  366. '  baud:  19200              0 0 0 - - - - -   (Reg.ax OR &H00)
  367. '         38400              0 0 1 - - - - -   (Reg.ax OR &H20)
  368. '           300              0 1 0 - - - - -   (Reg.ax OR &H40)
  369. '           600              0 1 1 - - - - -   (Reg.ax OR &H60)
  370. '          1200              1 0 0 - - - - -   (Reg.ax OR &H80)
  371. '          2400              1 0 1 - - - - -   (Reg.ax OR &HA0)
  372. '          4800              1 1 0 - - - - -   (Reg.ax OR &HC0)
  373. '          9600              1 1 1 - - - - -   (Reg.ax OR &HE0)
  374. '
  375. ' Parity:  None              - - - 0 0 - - -   (Reg.ax OR &H00)
  376. '          Odd               - - - 0 1 - - -   (Reg.ax OR &H08)
  377. '          None              - - - 1 0 - - -   (Reg.ax OR &H10)
  378. '          Even              - - - 1 1 - - -   (Reg.ax OR &H18)
  379. '
  380. ' Stop Bits: 1               - - - - - 0 - -   (Reg.ax OR &H00)
  381. '            2               - - - - - 1 - -   (Reg.ax OR &H04)
  382. '
  383. ' Character Len:  5          - - - - - - 0 0   (Reg.ax OR &H00)
  384. '                 6          - - - - - - 0 1   (Reg.ax OR &H01)
  385. '                 7          - - - - - - 1 0   (Reg.ax OR &H02)
  386. '                 8          - - - - - - 1 1   (Reg.ax OR &H03)
  387.  
  388. SELECT CASE Baud$
  389.     CASE "300"
  390.     Reg.ax = (Reg.ax OR &H40)
  391.     CASE "600"
  392.     Reg.ax = (Reg.ax OR &H60)
  393.     CASE "1200"
  394.     Reg.ax = (Reg.ax OR &H80)
  395.     CASE "2400"
  396.     Reg.ax = (Reg.ax OR &HA0)
  397.     CASE "4800"
  398.     Reg.ax = (Reg.ax OR &HC0)
  399.     CASE "9600"
  400.     Reg.ax = (Reg.ax OR &HE0)
  401.     CASE "19200"
  402.     Reg.ax = (Reg.ax OR &H0)
  403.     CASE "38400"
  404.     Reg.ax = (Reg.ax OR &H20)
  405.     CASE ELSE
  406.     Reg.ax = (Reg.ax OR &HE0)
  407.     CLS
  408.     PRINT
  409.     PRINT "Invalid parameter for Baud rate in SetBaud:  "; CHR$(34); Baud$; CHR$(34)
  410.     PRINT "Defaulting to 9600 baud."
  411.     PRINT
  412.     SLEEP (5)
  413. END SELECT
  414.        
  415. SELECT CASE Bits%
  416.     CASE 5
  417.     Reg.ax = (Reg.ax OR &H0)
  418.     CASE 6
  419.     Reg.ax = (Reg.ax OR &H1)
  420.     CASE 7
  421.     Reg.ax = (Reg.ax OR &H2)
  422.     CASE 8
  423.     Reg.ax = (Reg.ax OR &H3)
  424.     CASE ELSE
  425.     Reg.ax = (Reg.ax OR &H3)
  426.     CLS
  427.     PRINT
  428.     PRINT "Invalid parameter for DataBits in SetBaud:  "; LTRIM$(STR$(Bits%))
  429.     PRINT "Defaulting to 8 bits per word."
  430.     PRINT
  431.     SLEEP (5)
  432. END SELECT
  433.  
  434. SELECT CASE Stops%
  435.     CASE 1
  436.     Reg.ax = (Reg.ax OR &H0)
  437.     CASE 2
  438.     Reg.ax = (Reg.ax OR &H4)
  439.     CASE ELSE
  440.     Reg.ax = (Reg.ax OR &H0)
  441.     CLS
  442.     PRINT
  443.     PRINT "Invalid parameter for Stop Bits in SetBaud:  "; LTRIM$(STR$(Stops%))
  444.     PRINT "Defaulting to 1 stop bit."
  445.     PRINT
  446.     SLEEP (5)
  447. END SELECT
  448.  
  449. SELECT CASE UCASE$(Parity$)
  450.     CASE "NONE"
  451.     Reg.ax = (Reg.ax OR &H0)
  452.     CASE "ODD"
  453.     Reg.ax = (Reg.ax OR &H8)
  454.     CASE "EVEN"
  455.     Reg.ax = (Reg.ax OR &H18)
  456.     CASE ELSE
  457.     Reg.ax = (Reg.ax OR &H0)
  458.     CLS
  459.     PRINT
  460.     PRINT "Invalid parameter for Parity in SetBaud:  "; CHR$(34); Parity$; CHR$(34)
  461.     PRINT "Defaulting to NO Patiry."
  462.     PRINT
  463.     SLEEP (5)
  464. END SELECT
  465.  
  466. ' ah = &H00    Fossil Function Number - Set Communications Parameters
  467. ' al = &Hxx    Baud/Parity/Stops
  468. ' dx = Communications port number (0-3)
  469.  
  470. Reg.dx = ComPort%
  471. CALL Interrupt(&H14, Reg, Reg)
  472.  
  473. END SUB
  474.  
  475. SUB Status (ComPort%, Info%, Reg AS RegType)
  476.  
  477. ' ah = &H03     Fossil Function Number - Status
  478. ' al = &H00     Place Holder
  479. ' dx = Communications port number       (0-3)
  480. '
  481. ' Info% = Bitmap                  4 3 2 1 0
  482. '
  483. ' DCD True                       - - - - 1  OR &H01
  484. ' Characters in input buffer     - - - 1 -  OR &H02
  485. ' Input buffer over-run          - - 1 - -  OR &H04
  486. ' Characters in output buffer    - 1 - - -  OR &H08
  487. ' Output buffer full             1 - - - -  OR &H10
  488.  
  489. Reg.dx = ComPort%
  490. Reg.ax = &H300
  491. CALL Interrupt(&H14, Reg, Reg)
  492.  
  493. IF (Reg.ax AND &H80) <> 0 THEN ' Carrier Detect TRUE
  494.     Info% = (Info% OR &H1)
  495. END IF
  496.  
  497. IF (Reg.ax AND &H100) <> 0 THEN ' Data in input buffer
  498.     Info% = (Info% OR &H2)
  499. END IF
  500.  
  501. IF (Reg.ax AND &H200) <> 0 THEN ' Input buffer overun
  502.     Info% = (Info% OR &H4)
  503. END IF
  504.  
  505. IF (Reg.ax AND &H4000) = 0 THEN ' Data in output buffer
  506.     Info% = (Info% OR &H8)
  507. END IF
  508.  
  509. IF (Reg.ax AND &H2000) = 0 THEN ' Output buffer full
  510.     Info% = (Info% OR &H10)
  511. END IF
  512.  
  513. END SUB
  514.  
  515. SUB Terminal (ComPort%, AnsiHand%, Baud$, HandShake%, Echo%, LineFeeds%, Reg AS RegType)
  516.  
  517. Bits% = 8
  518. Stops% = 1
  519. Parity$ = "NONE"
  520.  
  521. CALL FossilInit(ComPort%, Reg)
  522. CALL SetHandShake(ComPort%, HandShake%, Reg)
  523. CALL SetPortParams(ComPort%, Baud$, Bits%, Stops%, Parity$, Reg)
  524.  
  525. Cr$ = CHR$(&HD)
  526. Lf$ = CHR$(&HA)
  527. CrLf$ = Cr$ + Lf$
  528. DtrStatus$ = "H"
  529.  
  530. GOSUB ModeStatus
  531.  
  532. DO
  533. ReCheck:
  534.     C$ = INKEY$
  535.     IF LEN(C$) > 0 THEN
  536.     A$ = LEFT$(C$, 1)
  537.     IF LEN(C$) > 1 THEN
  538.         A$ = UCASE$(LEFT$(C$, 1))
  539.         B$ = UCASE$(RIGHT$(C$, 1))
  540.         SELECT CASE (ASC(A$) * &H100) + ASC(B$)
  541.  
  542.         CASE 81 ' Trap PgDn Download Command
  543.             SHELL "DSZ port " + LTRIM$(STR$(ComPort% + 1)) + " rz"
  544.             GOTO ReCheck
  545.         
  546.         CASE 73 ' Trap PgUp UpLoad Command
  547.             INPUT "Enter File Name to send "; FileName$
  548.             IF FileName$ <> "" THEN
  549.             SHELL "DSZ port " + LTRIM$(STR$(ComPort% + 1)) + " sz " + LCASE$(FileName$)
  550.             END IF
  551.             GOTO ReCheck
  552.  
  553.         CASE 36 ' Trap Alt+J Dos Shell Command
  554.             SHELL
  555.             CALL AnsiPrint(AnsiHand%, CrLf$ + "Terminal in operation now." + CrLf$)
  556.             GOTO ReCheck
  557.  
  558.         CASE 45 ' Trap Alt+X EXIT Command
  559.             CALL AnsiPrint(AnsiHand%, CrLf$ + "Lower DTR signal? [Y/n]")
  560.             DO
  561.             SELECT CASE UCASE$(INKEY$)
  562.                 CASE "Y", CHR$(&HD)
  563.                 CALL SetDtr(ComPort%, "LOW", Reg)
  564.                 EXIT SUB
  565.                 CASE "N"
  566.                 EXIT SUB
  567.                 CASE ELSE
  568.             END SELECT
  569.             LOOP
  570.  
  571.         CASE 32  ' Trap Alt+D DTR Toggle Command
  572.             IF DtrStatus$ = "H" THEN
  573.             DtrStatus$ = "L"
  574.               ELSE
  575.             DtrStatus$ = "H"
  576.             END IF
  577.             GOSUB ModeStatus
  578.             GOTO ReCheck
  579.  
  580.         CASE 35 ' Trap Alt+H HangUp Command
  581.             CALL AnsiPrint(AnsiHand%, CrLf$ + "Hanging up Modem" + CrLf$)
  582.             CALL SetDtr(ComPort%, "LOW", Reg)
  583.             SLEEP (2)
  584.             CALL SetDtr(ComPort%, "HIGH", Reg)
  585.             GOTO ReCheck
  586.  
  587.         CASE 44 ' Trap Alt+Z Status Command
  588.             GOSUB ModeStatus
  589.             GOTO ReCheck
  590.  
  591.         CASE 48 ' Trap Alt+B Baud Command Command
  592.             CALL BaudSelect(ComPort%, AnsiHand%, Baud$, Bits%, Stops%, Parity$, Reg)
  593.             GOTO ReCheck
  594.  
  595.         CASE 18 ' Trap Alt+E ECHO Command
  596.             Echo% = (Echo% + 1) MOD 2
  597.             GOSUB ModeStatus
  598.             GOTO ReCheck
  599.  
  600.         CASE 68 ' Trap F10 Hex Mode/Debug command
  601.             HexMode% = (HexMode% + 1) MOD 2
  602.             GOSUB ModeStatus
  603.             GOTO ReCheck
  604.  
  605.         CASE 46 ' Trap Alt+C CLEAR SCREEN Command
  606.             CALL AnsiPrint(AnsiHand%, CHR$(27) + "[2J")          ' Clear the screen
  607.             GOTO ReCheck
  608.  
  609.         CASE 38  ' Trap Alt+L Line Feed Addition command
  610.             LineFeeds% = (LineFeeds% + 1) MOD 4
  611.             GOSUB ModeStatus
  612.             GOTO ReCheck
  613.  
  614.         CASE ELSE
  615.             CALL AnsiPrint(AnsiHand%, " Alt KeyCode = " + LTRIM$(STR$(ASC(B$))) + CrLf$)
  616.             GOTO ReCheck
  617.         END SELECT
  618.     END IF
  619.  
  620.     IF Echo% = 1 THEN CALL AnsiPrint(AnsiHand%, A$)
  621.            
  622.     Send% = ASC(A$)
  623.     CALL Transmit(ComPort%, Send%, Reg)
  624.            
  625.     IF A$ = Cr$ THEN
  626.         IF Echo% = 1 THEN CALL AnsiPrint(AnsiHand%, Lf$)
  627.     END IF
  628.  
  629.     IF (LineFeeds% AND 2) = 2 THEN
  630.         Send% = &HA
  631.         CALL Transmit(ComPort%, Send%, Reg)
  632.     END IF
  633.  
  634.     END IF
  635.  
  636.     CALL Recieve(ComPort%, Send%, Reg)
  637.     IF Send% > -1 THEN
  638.     IF HexMode% = 1 THEN
  639.         Temp$ = LTRIM$(HEX$(Send%))
  640.         Temp$ = STRING$(2 - LEN(Temp$), "0") + Temp$
  641.         Temp$ = "&H" + Temp$ + CrLf$
  642.         CALL AnsiPrint(AnsiHand%, Temp$)
  643.       ELSE
  644.         CALL AnsiPrint(AnsiHand%, CHR$(Send%))
  645.         IF Send% = &HA AND LineFeeds% MOD 2 = 1 THEN
  646.         CALL AnsiPrint(AnsiHand%, CHR$(&HA))
  647.         END IF
  648.     END IF
  649.     END IF
  650. LOOP
  651.  
  652. ModeStatus:
  653.  
  654. CALL AnsiPrint(AnsiHand%, CrLf$)
  655.  
  656. ' ----- Alt+D DTR Status
  657. IF DtrStatus$ = "L" THEN
  658.     CALL AnsiPrint(AnsiHand%, " *** DTR is LOW" + CrLf$)
  659.   ELSE
  660.     CALL AnsiPrint(AnsiHand%, "     DTR is HIGH" + CrLf$)
  661. END IF
  662.  
  663. ' ----- Alt+E ECHO Status
  664. IF Echo% = 1 THEN
  665.     CALL AnsiPrint(AnsiHand%, " *** Local Echo ON (Half Duplex)" + CrLf$)
  666.   ELSE
  667.     CALL AnsiPrint(AnsiHand%, "     Local Echo OFF (Full Duplex)" + CrLf$)
  668. END IF
  669.  
  670. ' ----- Alt+H HEX Mode Status
  671. IF HexMode% = 1 THEN
  672.     CALL AnsiPrint(AnsiHand%, " *** Hex Mode ON" + CrLf$)
  673.   ELSE
  674.     CALL AnsiPrint(AnsiHand%, "     Hex Mode OFF" + CrLf$)
  675. END IF
  676.  
  677. ' ----- Alt+S String Mode Status
  678. IF StringMode% = 1 THEN
  679.     CALL AnsiPrint(AnsiHand%, " *** String Mode ON" + CrLf$)
  680.   ELSE
  681.     CALL AnsiPrint(AnsiHand%, "     String Mode OFF" + CrLf$)
  682. END IF
  683.  
  684. ' ----- Trap Alt+L Line Feed Addition command
  685.  
  686. SELECT CASE LineFeeds% AND 1
  687.     CASE 0
  688.     CALL AnsiPrint(AnsiHand%, "     NOT Adding LF's to Recieved CR's" + CrLf$)
  689.     CASE 1
  690.     CALL AnsiPrint(AnsiHand%, " *** Adding LF's to Recieved CR's" + CrLf$)
  691. END SELECT
  692.  
  693. SELECT CASE LineFeeds% AND 2
  694.     CASE 0
  695.     CALL AnsiPrint(AnsiHand%, "     NOT Adding LF's to Transmitted CR's" + CrLf$)
  696.     CASE 2
  697.     CALL AnsiPrint(AnsiHand%, " *** Adding LF's to Transmitted CR's" + CrLf$)
  698. END SELECT
  699.  
  700. CALL AnsiPrint(AnsiHand%, CrLf$)
  701.        
  702. RETURN
  703.  
  704. END SUB
  705.  
  706. SUB Transmit (ComPort%, Send%, Reg AS RegType)
  707.  
  708. ' ah = &H03      Fossil Function Number - StatusRequest
  709. ' al = &H00      Place Holder
  710. ' dx = Communications port (0-3)
  711. '
  712.  
  713. CALL Status(ComPort%, Info%, Reg) ' Test for space in OUTPUT buffer
  714. IF (Info% AND &H10) = 0 THEN ' Space in output buffer
  715.     ' ah = &H01      Fossil Function Number - Transmit Character
  716.     ' al = &Hxx      Character to be Transmitted
  717.     ' dx = Communications port (0-3)
  718.     Reg.dx = ComPort%
  719.     Reg.ax = &H100 + Send%
  720.     CALL Interrupt(&H14, Reg, Reg)
  721.   ELSE
  722.     Send% = -2 ' Output buffer full
  723.     ' ah = &H09      Fossil Function Number - Purge OUTPUT Buffer
  724.     ' al = &H00      Place Holder
  725.     ' dx = Communications port (0-3)
  726.     Reg.ax = &H900
  727.     Reg.dx = ComPort%
  728.     CALL Interrupt(&H14, Reg, Reg)
  729.     CLS
  730.     PRINT
  731.     PRINT " *** Output Buffer Full."
  732.     PRINT "     Transmission Terminated and buffer purged."
  733.     PRINT
  734.     SLEEP (5)
  735. END IF
  736.  
  737. END SUB
  738.  
  739.